<?php

/**
 * 中文转拼音
 *
 * @author	   jonwang(jonwang@myqee.com)
 * @category   MyQEE
 * @package	   System
 * @subpackage Core
 * @copyright  Copyright (c) 2008-2011 myqee.com
 * @license	   http://www.myqee.com/license.html
 */
class MyQEE_PinYin
{
    protected static $d = array(
        array("a", - 20319),
        array("ai", - 20317),
        array("an", - 20304),
        array("ang", - 20295),
        array("ao", - 20292),
        array("ba", - 20283),
        array("bai", - 20265),
        array("ban", - 20257),
        array("bang", - 20242),
        array("bao", - 20230),
        array("bei", - 20051),
        array("ben", - 20036),
        array("beng", - 20032),
        array("bi", - 20026),
        array("bian", - 20002),
        array("biao", - 19990),
        array("bie", - 19986),
        array("bin", - 19982),
        array("bing", - 19976),
        array("bo", - 19805),
        array("bu", - 19784),
        array("ca", - 19775),
        array("cai", - 19774),
        array("can", - 19763),
        array("cang", - 19756),
        array("cao", - 19751),
        array("ce", - 19746),
        array("ceng", - 19741),
        array("cha", - 19739),
        array("chai", - 19728),
        array("chan", - 19725),
        array("chang", - 19715),
        array("chao", - 19540),
        array("che", - 19531),
        array("chen", - 19525),
        array("cheng", - 19515),
        array("chi", - 19500),
        array("chong", - 19484),
        array("chou", - 19479),
        array("chu", - 19467),
        array("chuai", - 19289),
        array("chuan", - 19288),
        array("chuang", - 19281),
        array("chui", - 19275),
        array("chun", - 19270),
        array("chuo", - 19263),
        array("ci", - 19261),
        array("cong", - 19249),
        array("cou", - 19243),
        array("cu", - 19242),
        array("cuan", - 19238),
        array("cui", - 19235),
        array("cun", - 19227),
        array("cuo", - 19224),
        array("da", - 19218),
        array("dai", - 19212),
        array("dan", - 19038),
        array("dang", - 19023),
        array("dao", - 19018),
        array("de", - 19006),
        array("deng", - 19003),
        array("di", - 18996),
        array("dian", - 18977),
        array("diao", - 18961),
        array("die", - 18952),
        array("ding", - 18783),
        array("diu", - 18774),
        array("dong", - 18773),
        array("dou", - 18763),
        array("du", - 18756),
        array("duan", - 18741),
        array("dui", - 18735),
        array("dun", - 18731),
        array("duo", - 18722),
        array("e", - 18710),
        array("en", - 18697),
        array("er", - 18696),
        array("fa", - 18526),
        array("fan", - 18518),
        array("fang", - 18501),
        array("fei", - 18490),
        array("fen", - 18478),
        array("feng", - 18463),
        array("fo", - 18448),
        array("fou", - 18447),
        array("fu", - 18446),
        array("ga", - 18239),
        array("gai", - 18237),
        array("gan", - 18231),
        array("gang", - 18220),
        array("gao", - 18211),
        array("ge", - 18201),
        array("gei", - 18184),
        array("gen", - 18183),
        array("geng", - 18181),
        array("gong", - 18012),
        array("gou", - 17997),
        array("gu", - 17988),
        array("gua", - 17970),
        array("guai", - 17964),
        array("guan", - 17961),
        array("guang", - 17950),
        array("gui", - 17947),
        array("gun", - 17931),
        array("guo", - 17928),
        array("ha", - 17922),
        array("hai", - 17759),
        array("han", - 17752),
        array("hang", - 17733),
        array("hao", - 17730),
        array("he", - 17721),
        array("hei", - 17703),
        array("hen", - 17701),
        array("heng", - 17697),
        array("hong", - 17692),
        array("hou", - 17683),
        array("hu", - 17676),
        array("hua", - 17496),
        array("huai", - 17487),
        array("huan", - 17482),
        array("huang", - 17468),
        array("hui", - 17454),
        array("hun", - 17433),
        array("huo", - 17427),
        array("ji", - 17417),
        array("jia", - 17202),
        array("jian", - 17185),
        array("jiang", - 16983),
        array("jiao", - 16970),
        array("jie", - 16942),
        array("jin", - 16915),
        array("jing", - 16733),
        array("jiong", - 16708),
        array("jiu", - 16706),
        array("ju", - 16689),
        array("juan", - 16664),
        array("jue", - 16657),
        array("jun", - 16647),
        array("ka", - 16474),
        array("kai", - 16470),
        array("kan", - 16465),
        array("kang", - 16459),
        array("kao", - 16452),
        array("ke", - 16448),
        array("ken", - 16433),
        array("keng", - 16429),
        array("kong", - 16427),
        array("kou", - 16423),
        array("ku", - 16419),
        array("kua", - 16412),
        array("kuai", - 16407),
        array("kuan", - 16403),
        array("kuang", - 16401),
        array("kui", - 16393),
        array("kun", - 16220),
        array("kuo", - 16216),
        array("la", - 16212),
        array("lai", - 16205),
        array("lan", - 16202),
        array("lang", - 16187),
        array("lao", - 16180),
        array("le", - 16171),
        array("lei", - 16169),
        array("leng", - 16158),
        array("li", - 16155),
        array("lia", - 15959),
        array("lian", - 15958),
        array("liang", - 15944),
        array("liao", - 15933),
        array("lie", - 15920),
        array("lin", - 15915),
        array("ling", - 15903),
        array("liu", - 15889),
        array("long", - 15878),
        array("lou", - 15707),
        array("lu", - 15701),
        array("lv", - 15681),
        array("luan", - 15667),
        array("lue", - 15661),
        array("lun", - 15659),
        array("luo", - 15652),
        array("ma", - 15640),
        array("mai", - 15631),
        array("man", - 15625),
        array("mang", - 15454),
        array("mao", - 15448),
        array("me", - 15436),
        array("mei", - 15435),
        array("men", - 15419),
        array("meng", - 15416),
        array("mi", - 15408),
        array("mian", - 15394),
        array("miao", - 15385),
        array("mie", - 15377),
        array("min", - 15375),
        array("ming", - 15369),
        array("miu", - 15363),
        array("mo", - 15362),
        array("mou", - 15183),
        array("mu", - 15180),
        array("na", - 15165),
        array("nai", - 15158),
        array("nan", - 15153),
        array("nang", - 15150),
        array("nao", - 15149),
        array("ne", - 15144),
        array("nei", - 15143),
        array("nen", - 15141),
        array("neng", - 15140),
        array("ni", - 15139),
        array("nian", - 15128),
        array("niang", - 15121),
        array("niao", - 15119),
        array("nie", - 15117),
        array("nin", - 15110),
        array("ning", - 15109),
        array("niu", - 14941),
        array("nong", - 14937),
        array("nu", - 14933),
        array("nv", - 14930),
        array("nuan", - 14929),
        array("nue", - 14928),
        array("nuo", - 14926),
        array("o", - 14922),
        array("ou", - 14921),
        array("pa", - 14914),
        array("pai", - 14908),
        array("pan", - 14902),
        array("pang", - 14894),
        array("pao", - 14889),
        array("pei", - 14882),
        array("pen", - 14873),
        array("peng", - 14871),
        array("pi", - 14857),
        array("pian", - 14678),
        array("piao", - 14674),
        array("pie", - 14670),
        array("pin", - 14668),
        array("ping", - 14663),
        array("po", - 14654),
        array("pu", - 14645),
        array("qi", - 14630),
        array("qia", - 14594),
        array("qian", - 14429),
        array("qiang", - 14407),
        array("qiao", - 14399),
        array("qie", - 14384),
        array("qin", - 14379),
        array("qing", - 14368),
        array("qiong", - 14355),
        array("qiu", - 14353),
        array("qu", - 14345),
        array("quan", - 14170),
        array("que", - 14159),
        array("qun", - 14151),
        array("ran", - 14149),
        array("rang", - 14145),
        array("rao", - 14140),
        array("re", - 14137),
        array("ren", - 14135),
        array("reng", - 14125),
        array("ri", - 14123),
        array("rong", - 14122),
        array("rou", - 14112),
        array("ru", - 14109),
        array("ruan", - 14099),
        array("rui", - 14097),
        array("run", - 14094),
        array("ruo", - 14092),
        array("sa", - 14090),
        array("sai", - 14087),
        array("san", - 14083),
        array("sang", - 13917),
        array("sao", - 13914),
        array("se", - 13910),
        array("sen", - 13907),
        array("seng", - 13906),
        array("sha", - 13905),
        array("shai", - 13896),
        array("shan", - 13894),
        array("shang", - 13878),
        array("shao", - 13870),
        array("she", - 13859),
        array("shen", - 13847),
        array("sheng", - 13831),
        array("shi", - 13658),
        array("shou", - 13611),
        array("shu", - 13601),
        array("shua", - 13406),
        array("shuai", - 13404),
        array("shuan", - 13400),
        array("shuang", - 13398),
        array("shui", - 13395),
        array("shun", - 13391),
        array("shuo", - 13387),
        array("si", - 13383),
        array("song", - 13367),
        array("sou", - 13359),
        array("su", - 13356),
        array("suan", - 13343),
        array("sui", - 13340),
        array("sun", - 13329),
        array("suo", - 13326),
        array("ta", - 13318),
        array("tai", - 13147),
        array("tan", - 13138),
        array("tang", - 13120),
        array("tao", - 13107),
        array("te", - 13096),
        array("teng", - 13095),
        array("ti", - 13091),
        array("tian", - 13076),
        array("tiao", - 13068),
        array("tie", - 13063),
        array("ting", - 13060),
        array("tong", - 12888),
        array("tou", - 12875),
        array("tu", - 12871),
        array("tuan", - 12860),
        array("tui", - 12858),
        array("tun", - 12852),
        array("tuo", - 12849),
        array("wa", - 12838),
        array("wai", - 12831),
        array("wan", - 12829),
        array("wang", - 12812),
        array("wei", - 12802),
        array("wen", - 12607),
        array("weng", - 12597),
        array("wo", - 12594),
        array("wu", - 12585),
        array("xi", - 12556),
        array("xia", - 12359),
        array("xian", - 12346),
        array("xiang", - 12320),
        array("xiao", - 12300),
        array("xie", - 12120),
        array("xin", - 12099),
        array("xing", - 12089),
        array("xiong", - 12074),
        array("xiu", - 12067),
        array("xu", - 12058),
        array("xuan", - 12039),
        array("xue", - 11867),
        array("xun", - 11861),
        array("ya", - 11847),
        array("yan", - 11831),
        array("yang", - 11798),
        array("yao", - 11781),
        array("ye", - 11604),
        array("yi", - 11589),
        array("yin", - 11536),
        array("ying", - 11358),
        array("yo", - 11340),
        array("yong", - 11339),
        array("you", - 11324),
        array("yu", - 11303),
        array("yuan", - 11097),
        array("yue", - 11077),
        array("yun", - 11067),
        array("za", - 11055),
        array("zai", - 11052),
        array("zan", - 11045),
        array("zang", - 11041),
        array("zao", - 11038),
        array("ze", - 11024),
        array("zei", - 11020),
        array("zen", - 11019),
        array("zeng", - 11018),
        array("zha", - 11014),
        array("zhai", - 10838),
        array("zhan", - 10832),
        array("zhang", - 10815),
        array("zhao", - 10800),
        array("zhe", - 10790),
        array("zhen", - 10780),
        array("zheng", - 10764),
        array("zhi", - 10587),
        array("zhong", - 10544),
        array("zhou", - 10533),
        array("zhu", - 10519),
        array("zhua", - 10331),
        array("zhuai", - 10329),
        array("zhuan", - 10328),
        array("zhuang", - 10322),
        array("zhui", - 10315),
        array("zhun", - 10309),
        array("zhuo", - 10307),
        array("zi", - 10296),
        array("zong", - 10281),
        array("zou", - 10274),
        array("zu", - 10270),
        array("zuan", - 10262),
        array("zui", - 10260),
        array("zun", - 10256),
        array("zuo", - 10254)
    );

    static protected function _g($num)
    {
        if ( $num > 0 && $num < 160 )
        {
            return chr($num);
        }
        elseif ( $num < - 20319 || $num > - 10247 )
        {
            return "";
        }
        else
        {
            for( $i = count(self::$d) - 1; $i >= 0; $i -- )
            {
                if ( self::$d[$i][1] <= $num ) break;
            }
            return self::$d[$i][0];
        }
    }

    static public function get($str, $charset = 'UTF-8')
    {
        if ( !$charset || ($charset = strtoupper($charset)) != 'GBK' || $charset != 'GB2312' )
        {
            $str = iconv($charset, 'GBK', $str);
        }
        $ret = '';
        for( $i = 0; $i < strlen($str); $i ++ )
        {
            $p = ord(substr($str, $i, 1));
            if ( $p > 160 )
            {
                $q = ord(substr($str, ++ $i, 1));
                $p = $p * 256 + $q - 65536;
            }
            $ret .= self::_g($p);
        }
        return $ret;
    }
}
